﻿using System.Collections.Generic;
using System.Linq;

namespace CamlQueryCreator.Common
{
    /// <summary>
    /// Базовый элемент CAML запроса.
    /// </summary>
    public abstract class CamlBase
    {
        /// <summary>
        /// Перечень дочерних построителей запросов.
        /// </summary>
        protected List<CamlBase> ChildBuilders { get; private set; }

        /// <summary>
        /// Базовый элемент CAML запроса.
        /// <para>Конструктор.</para>
        /// </summary>
        protected CamlBase(CamlBase parentBuilder)
        {
            ChildBuilders = new List<CamlBase>();

            if (parentBuilder != null)
                parentBuilder.ChildBuilders.Add(this);
        }

        /// <summary>
        /// Формирует запрос на основе итогового дочернего запроса и возвращает результат.
        /// </summary>
        protected abstract string GetQuery(string childQuery);

        /// <summary>
        /// Возвращает итоговый текст запроса.
        /// </summary>
        internal string GetQuery()
        {
            var childQuery = ChildBuilders
                .Select(i => i.GetQuery())                
                .OrderBy(i => i)
                .Aggregate(string.Empty, (current, i) => string.Format("{0}{1}", current, i));

            //var childQuery = ChildBuilders.Aggregate(string.Empty,
            //                                    (current, i) => string.Format("{0}{1}", current, i.GetQuery()));
            return GetQuery(childQuery);
        }
    }
}
